<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// JS中的数据类型：String Number Boolean null undefined Object
// ES6新增了 Symbol 数据类型
// Symbol表示一个独一无二的值

// 创建Symbol值
let s1 = Symbol();
let s2 = Symbol();
console.log( s1 );// Symbol()
console.log( s2 );// Symbol()
console.log( typeof s1 );// 'symbol'
console.log( typeof s2 );// 'symbol'
console.log( s1 === s2 );// false

// 创建Symbol值的时候，可以传入一个'标识符'，这个'标识符'对于Symbol没有影响
let s3 = Symbol('name');
let s4 = Symbol('name');
console.log( s3 );// Symbol(name)
console.log( s3 );// Symbol(name)
console.log( s3 === s4 );// false


// JS中对象的属性名只能是字符串（有可能导致键重名）
let obj1 = {
    name: '张三',
    age: 23,
    sex: '女',
    name: '李四'
}
console.log( obj1.name );// '李四'

// Symbol值的作用：作为对象的属性名
// 好处：1.起到保护/隐藏对象属性的作用；2.对象的属性不会重名。
let obj2 = {
    [Symbol('name')]: '张三',
    age: 23,
    sex: '女',
    [Symbol('nick')]: '李四'
}

console.log( obj2[Symbol('name')] );// undefined
console.log( obj2[Symbol('nick')] );// undefined

for (let key in obj2){
    console.log( key );// 'age' 'sex'
}

// Object.getOwnPropertySymbols(obj)返回obj对象自身所有Symbol属性的数组
let arr2 = Object.getOwnPropertySymbols(obj2);
console.log( arr2 );// [Symbol(name), Symbol(nick)]
console.log( obj2[arr2[0]] );// 张三
console.log( obj2[arr2[1]] );// 李四


// Symbol的iterator属性：
console.log( Symbol.iterator );// Symbol(Symbol.iterator)
// Symbol.iterator === Symbol('Symbol.iterator')

let s5 = Symbol('Symbol.iterator');
console.log( s5 );// Symbol(Symbol.iterator)

console.log( s5 === Symbol.iterator);// false

</script>
</body>
</html>